<?php

namespace origin;

/**
 * 配置类 (Config AS C)
 * @explain 加载配置
 * @author dece <decezz@qq.com>
 */
class C implements \ArrayAccess
{
    /**
     * 配置
     */
    public static $config = [];
    /**
     * 作用域
     */
    protected static $range = '_origin_';

    /**
     * 添加配置
     * @access public
     * @param  string    $name   配置名称
     * @param  mixed     $value  配置数据
     * @param  string    $range  作用域
     * @return mixed
     */
    public static function set( string $name , $value = null , $range = '' )
    {
        $range = self::parse_range($range);

        // 是否支持二维数组
        if (strpos($name, '.') !== false) {
            // 二维数组
            $name = explode('.', $name, 2);
            self::$config[$range][$name[0]][$name[1]] = $value;
        } else {
            self::$config[$range][$name] = $value;
        }
        return $value;
    }

    /**
     * 获取配置
     * @access public
     * @param  string    $name   配置名称
     * @param  string    $range  作用域
     * @return mixed
     */
    public static function get( string $name , $range = '' )
    {
        $range = $range ? $range : self::$range ;

        if (!isset(self::$config[$range])) {
            return null;
        }
        
        // 是否支持二维数组
        if (strpos($name, '.') !== false) {
            // 二维数组
            $name = explode('.', $name, 2);
            if (isset(self::$config[$range][$name[0]][$name[1]])) {
                return self::$config[$range][$name[0]][$name[1]];
            }
        } else {
            if (isset(self::$config[$range][$name])) {
                return self::$config[$range][$name];
            }
        }
        return null;
    }

    /**
     * 解析配置
     * @access public
     * @param  string    $file   路径地址
     * @param  string    $name   配置名称
     * @param  string    $range  作用域
     * @return mixed
     */
    public static function parse( string $file , $name = null , $range = '' )
    {
        $range = self::parse_range($range);
        
        if (is_file($file)) {
            // 文件后缀
            $ext = pathinfo($file, PATHINFO_EXTENSION);
            // 只解析PHP后缀
            if ($ext == 'php') {

                if (isset($name)) {
                    self::set($name, (include $file), $range);
                } else {
                    self::$config[$range] = array_merge(self::$config[$range], (include $file));
                }
            }

        }
        return self::$config[$range];
    }

    /**
     * 检查配置是否存在
     * @access public
     * @param  string    $name   配置名称
     * @param  string    $range  作用域
     * @return bool
     */
    public static function has( string $name = '' , $range = '' )
    {
        $range = $range ? $range : self::$range ;
        
        // 是否支持二维数组
        if (strpos($name, '.') !== false) {
            // 二维数组
            $name = explode('.', $name, 2);
            return isset(self::$config[$range][$name[0]][$name[1]]);
        }
        return isset(self::$config[$range][$name]);
    }

    /**
     * 重置配置
     * @access public
     * @param  string    $range  作用域
     * @return void
     */
    public static function reset( $range = '' )
    {
        if ($range === true) {
            // 重置所有配置
            self::$config = [];
        } else {
            if (isset(self::$config[$range])) {
                // 清空作用域
                self::$config[$range] = [];
            }
        }
    }

    /**
     * 解析作用域
     * @access protected
     * @param  string    $range  作用域
     * @return string
     */
    protected static function parse_range( $range = '' )
    {
        $range = $range ? $range : self::$range ;

        if (!isset(self::$config[$range])) {
            self::$config[$range] = [];
        }
        return $range;
    }

    /**
     * 添加配置
     * @param  string   $name   配置名称
     * @param  mixed    $value  依赖配置
     * @return mixed
     */
    public function __set( $name , $value )
    {
        return self::set($name, $value);
    }

    /**
     * 获取配置
     * @param  string   $name   配置名称
     * @return mixed
     */
    public function __get( $name )
    {
        return self::get($name);
    }

    // ================================ ArrayAccess 数组式访问 ================================
    public function offsetSet( $offset , $value )
    {
        return self::set($offset, $value);
    }

    public function offsetGet( $offset )
    {
        return self::get($offset);
    }

    public function offsetUnset( $offset )
    {
        $range = self::$range;
        // 是否支持二维数组
        if (strpos($offset, '.') !== false) {
            // 二维数组
            $offset = explode('.', $offset, 2);
            if (isset(self::$config[$range][$offset[0]][$offset[1]])) {
                self::$config[$range][$offset[0]][$offset[1]] = [];
            }
        } else {
            if (isset(self::$config[$range][$offset])) {
                self::$config[$range][$offset] = [];
            }
        }
    }

    public function offsetExists( $offset )
    {
        return isset(self::$config[self::$range][$offset]);
    }
    // ================================ ArrayAccess 数组式访问 ================================
}